package com.openlogic.common.logic.func;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;

import com.alibaba.fastjson2.JSON;

/**
* @ClassName: CollectionFunc
* @Description: 集合操作自定义函数
* @author weiyongpeng
* @date 2024年7月22日 上午11:55:36
 */
public class CollectionFunc {

	// 这个类不能实例化
	private CollectionFunc() {
	}

	/**
	* 描述：集合包含操作函数
	* @Title: contains
	* @param list
	* @param target
	* @return
	* @author weiyongpeng
	* @date  2024年12月2日 上午10:07:18
	 */
	public static boolean contains(Object list, Object target) {
		String jsonString = JSON.toJSONString(list);
		jsonString = StringEscapeUtils.unescapeJava(jsonString);
		return StringUtils.contains(jsonString, String.valueOf(target));
	}
	
	/**
	* 描述：集合不包含操作函数
	* @Title: notcontains
	* @param list
	* @param target
	* @return
	* @author weiyongpeng
	* @date  2024年12月22日 下午12:04:31
	 */
	public static boolean notcontains(Object list, Object target) {
		String jsonString = JSON.toJSONString(list);
		jsonString = StringEscapeUtils.unescapeJava(jsonString);
		return !StringUtils.contains(jsonString, String.valueOf(target));
	}
	
	/**
	* 描述：转化集合函数
	* @Title: toList
	* @param args 可变参数集
	* @return List<String> 字符串类型的集合
	* @author weiyongpeng
	* @date  2024年12月9日 上午8:50:39
	 */
	public static List<String> toList(Object ...args) {
		
		List<String> newList = new ArrayList<>();
		for (Object arg : args) {
			if (arg instanceof Integer) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof String) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof Float) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof Double) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof BigDecimal) {
				newList.add(String.valueOf(arg));
			} else {
				newList.add(String.valueOf(args));
			}
		}
		return newList;
	}
	

	/**
	* 描述：向集合中添加元素
	* @Title: add
	* @param args
	* @return
	* @author weiyongpeng
	* @date  2024年12月9日 上午9:08:50
	 */
	public static List<Object> add(List<Object> list, Object ... args) {
		for (Object arg : args) {
			if (arg instanceof Integer) {
				list.add(String.valueOf(arg));
			} else if(arg instanceof String) {
				list.add(String.valueOf(arg));
			} else if(arg instanceof Float) {
				list.add(String.valueOf(arg));
			} else if(arg instanceof Double) {
				list.add(String.valueOf(arg));
			} else if(arg instanceof BigDecimal) {
				list.add(String.valueOf(arg));
			} else {
				list.add(String.valueOf(args));
			}
		}
		return list;
	}
	
	/**
	* 描述：转化集合SET函数
	* @Title: toSet
	* @param args
	* @return
	* @author weiyongpeng
	* @date  2024年12月10日 下午6:02:36
	 */
	public static Set<String> toSet(Object ...args) {
		Set<String> newList = new LinkedHashSet<>();
		for (Object arg : args) {
			if (arg instanceof Integer) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof String) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof Float) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof Double) {
				newList.add(String.valueOf(arg));
			} else if(arg instanceof BigDecimal) {
				newList.add(String.valueOf(arg));
			} else {
				newList.add(String.valueOf(args));
			}
		}
		return newList;
	}
	
	/**
	* 描述：转化MAP函数
	* @Title: toMap
	* @param args key1 value1; key2 value2
	* @return {"key1":"value1","key2":"value2"}
	* @author weiyongpeng
	* @date  2024年12月9日 上午8:58:09
	 */
	public static Map<String, String> toMap(Object ... args) {
		Map<String, String> map = new HashMap<>();
		if (args.length % 2 != 0) {
			throw new SecurityException("确保转化的map的key和value成对!");
		}
		for (int i = 0; i < args.length; i+=2) {
			String key = "";
			String value = "";
			key = Optional.ofNullable(args[i]).isPresent() ? String.valueOf(args[i]) : "";
			value = Optional.ofNullable(args[i + 1]).isPresent() ? String.valueOf(args[i + 1]) : "";
			map.put(key, value);
		}
		return map;
	}
	
	/**
	* 描述：移除集合中的某一个元素
	* @Title: removeByIndex
	* @param list
	* @param index 移除元素的索引
	* @return
	* @author weiyongpeng
	* @date  2024年12月9日 上午9:13:38
	 */
	public static List<Object> removeByIndex(List<Object> list, int index) {
		if (index <= list.size() - 1) {
			list.remove(index);
		}
		return list;
	}
	
	/**
	* 描述：集合去重
	* @Title: distinct
	* @param list
	* @return
	* @author weiyongpeng
	* @date  2024年12月10日 下午4:40:50
	 */
	public static List<Object> distinct(List<Object> list){
		if (CollectionUtils.isEmpty(list)) {
			return list;
		}
		return list.stream().distinct().collect(Collectors.toList());
	}
	
	/**
	* 描述：结合拼接
	* @Title: concat
	* @param list1
	* @param list2
	* @return
	* @author weiyongpeng
	* @date  2024年12月10日 下午4:53:52
	 */
	public static List<Object> concat(List<Object> list1,List<Object> list2){
		List<Object> res = new ArrayList<Object>();
		res.addAll(list1);
		res.addAll(list2);
		return res;
	}
	
}